/*
 * 
 ****************************************************************************
 * 版本:  v1.0  2021年9月11日  (王治钦)
 * 版权所有:      青岛能蜂电气成都研发中心
 * 笔记:
 * 	1.v0.1  下午2:05:15  初始化文档
 ****************************************************************************
 *
 *
 */
package com.ems.algorithm;

import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Map;
import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;

/**
 * 按月日分表算法实现
 */
public class MonthAndDayShardingAlgorithm implements ComplexKeysShardingAlgorithm<Integer> {

	/**
	 * 月key
	 */
	private static final String MONTH_KEY = "statsmonth";
	/**
	 * 日key
	 */
	private static final String DAY_KEY = "statsday";

	@Override
	public Collection<String> doSharding(Collection<String> availableTargetNames,
			ComplexKeysShardingValue<Integer> shardingValue) {
		// 符合条件的表
		Collection<String> tables = new LinkedHashSet<>();
		// 逻辑表名
		String logictablename = shardingValue.getLogicTableName();
		// 月份的key以日key
		Map<String, Collection<Integer>> valuemap = shardingValue.getColumnNameAndShardingValuesMap();
		Collection<Integer> months = valuemap.get(MONTH_KEY);
		Collection<Integer> days = valuemap.get(DAY_KEY);
		// 拼凑出符合条件的表名
		for (Integer month : months) {
			for (Integer day : days) {
				String table = tablename(logictablename, month, day);
				tables.add(table);
			}
		}
		return tables;
	}

	/**
	 * 生成表名
	 * 
	 * @param logictablename 逻辑表
	 * @param month          月
	 * @param day            日
	 * @return 表名
	 */
	private String tablename(String logictablename, Integer month, Integer day) {
		return (logictablename + "_" + month + "_" + day).intern();
	}
}
